# 导入Django快捷函数，用于渲染模板和重定向
from django.shortcuts import render, redirect
# 导入购物车和订单模型
from .models import *
# 导入商品模型（用于购物车商品查询）
from commodity.models import *
# 导入JSON响应类，用于API接口返回数据
from django.http import JsonResponse
# 导入分页相关类，用于订单列表分页
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
# 导入登录验证装饰器，保护需要登录的视图
from django.contrib.auth.decorators import login_required
# 导入用户认证相关函数，处理登录登出
from django.contrib.auth import logout, login, authenticate
# 导入Django内置用户模型
from django.contrib.auth.models import User
# 导入反向解析函数，用于生成URL
from django.shortcuts import reverse
# 导入自定义表单类，处理用户登录
from .form import *
# 导入支付宝支付模块和日志器
# from .pays_new import get_pay, logger
from .pays import get_pay
# 导入随机数和字符串模块，用于生成订单号
import random
import string
# 导入时间模块，用于生成时间戳
import time

"""
用户登录视图函数
功能：处理用户登录请求，支持现有用户认证和新用户注册
"""


def loginView(request):
    title = '用户登录'  # 页面标题
    classContent = 'logins'  # 页面分类标识

    if request.method == 'POST':
        # 实例化登录模型表单并绑定POST数据
        infos = LoginModelForm(data=request.POST)
        data = infos.data  # 获取表单原始数据

        # 提取用户名和密码
        username = data.get('username', '')
        password = data.get('password', '')

        # 检查用户是否存在
        if User.objects.filter(username=username).exists():
            # 验证用户凭证
            user = authenticate(username=username, password=password)
            if user:
                # 登录用户并重定向到个人中心
                login(request, user)
                return redirect(reverse('shopper:shopper'))

        # 用户不存在时创建新用户
        else:
            state = '注册成功'  # 注册成功状态提示
            # 创建用户参数字典（包含必要字段）
            d = dict(username=username, password=password, is_staff=1, is_active=1)
            user = User.objects.create_user(**d)  # 创建新用户
            user.save()  # 保存到数据库
    else:
        # GET请求时实例化空表单
        infos = LoginModelForm()

    return render(request, 'login.html', locals())  # 渲染登录页面


"""
个人中心视图函数（需登录）
功能：展示用户订单列表，处理支付回调逻辑
"""


@login_required(login_url='/shopper/login.html')
def shopperView(request):
    title = '个人中心'
    classContent = 'informations'
    p = request.GET.get('p', 1)
    # 处理已支付的订单
    t = request.GET.get('t', '')
    payTime = request.session.get('payTime', '')
    if t and payTime and t == payTime:
        payInfo = request.session.get('payInfo', '')
        OrderInfos.objects.create(**payInfo)
        del request.session['payTime']
        del request.session['payInfo']
    # 根据当前用户查询用户订单信息
    orderInfos = OrderInfos.objects.filter(user_id=request.user.id).order_by('-created')
    # 分页功能
    paginator = Paginator(orderInfos, 7)
    try:
        pages = paginator.page(p)
    except PageNotAnInteger:
        pages = paginator.page(1)
    except EmptyPage:
        pages = paginator.page(paginator.num_pages)
    return render(request, 'shopper.html', locals())

"""
用户登出视图函数
功能：清除用户会话并重定向到首页
"""


def logoutView(request):
    logout(request)  # 调用Django内置登出函数
    return redirect(reverse('index:index'))  # 重定向到首页


"""
购物车视图函数（需登录）
功能：管理购物车商品，支持添加和更新商品数量
"""


@login_required(login_url='/shopper/login.html')  # 登录保护
def shopcartView(request):
    title = '我的购物车'  # 页面标题
    classContent = 'shopcarts'  # 页面分类标识
    userID = request.user.id  # 获取当前用户ID

    # 处理添加/更新购物车商品请求
    id = request.GET.get('id', '')  # 商品ID
    quantity = request.GET.get('quantity', 1)  # 商品数量，默认为1

    if id:
        # 更新或创建购物车记录（根据商品ID和用户ID）
        CartInfos.objects.update_or_create(
            commodityInfos_id=id,
            user_id=userID,
            defaults={'quantity': quantity}
        )
        return redirect('shopper:shopcart')  # 操作成功后重定向到购物车页面

    # 获取当前用户的购物车记录
    getUserId = CartInfos.objects.filter(user_id=userID)
    # 构建商品ID到数量的映射字典
    commodityDcit = {x.commodityInfos_id: x.quantity for x in getUserId}
    # 根据商品ID查询商品信息
    commodityInfos = CommodityInfos.objects.filter(id__in=commodityDcit.keys())

    return render(request, 'shopcart.html', locals())  # 渲染购物车页面


"""
购物车删除API视图函数
功能：处理购物车商品删除请求（支持按用户或商品ID删除）
"""


def deleteAPI(request):
    result = {'state': 'success'}  # 默认返回成功状态

    # 获取删除参数
    userId = request.GET.get('userId', '')  # 用户ID
    commodityId = request.GET.get('commodityId', '')  # 商品ID

    if userId:
        # 按用户ID删除所有购物车记录
        CartInfos.objects.filter(user_id=userId).delete()
    elif commodityId:
        # 按商品ID删除购物车记录
        CartInfos.objects.filter(commodityInfos_id=commodityId).delete()
    else:
        # 无有效参数时返回失败
        result = {'state': 'fail'}

    return JsonResponse(result)  # 返回JSON格式的删除结果


"""
支付视图函数
功能：生成支付宝支付链接，处理支付前的订单信息准备
"""


def paysView(request):
    total = request.GET.get('total', 0)  # 获取支付金额参数
    total = total.replace('￥', '')
    print(total)
    # 金额格式验证
    try:
        total = float(total)
    except ValueError:
        print("金额格式错误时重定向到购物车")
        return redirect('shopper:shopcart')  # 金额格式错误时重定向到购物车

    if total > 0:
        # 生成安全的订单号（时间戳+6位随机数）
        timestamp = int(time.time() * 1000)
        random_str = ''.join(random.choices(string.digits, k=6))
        out_trade_no = f"{timestamp}{random_str}"

        # 格式化金额为两位小数（避免精度问题）
        total_amount = "{:.2f}".format(total)

        # 准备订单信息并存储到会话（支付成功后创建订单）
        payInfo = dict(price=total, user_id=request.user.id, state='已支付')
        request.session['payInfo'] = payInfo
        request.session['payTime'] = out_trade_no  # 存储订单号用于回调验证

        # 构建回调URL（包含当前域名）
        domain = 'http://' + request.get_host()
        return_url = f"{domain}/shopper/pay_callback/"

        # 打印调试信息（生产环境可改为日志记录）
        print(f"out_trade_no: {out_trade_no}, type: {type(out_trade_no)}")
        print(f"total_amount: {total_amount}, type: {type(total_amount)}")
        print(f"return_url: {return_url}, type: {type(return_url)}")

        # 获取支付宝支付链接
        url = get_pay(out_trade_no, total_amount, return_url)
        print("支付宝支付链接：", url)

        # 重定向到支付页面或返回错误
        if url:
            return redirect(url)
        else:
            return redirect('shopper:shopcart')
    else:
        return redirect('shopper:shopcart')  # 金额为0或负数时重定向到购物车

# 新增 payCallbackView 视图函数
def payCallbackView(request):
    # 这里可以处理支付回调的逻辑，例如验证支付结果等
    # 示例代码，你可以根据实际需求修改
    payTime = request.session.get('payTime', '')
    if payTime:
        payInfo = request.session.get('payInfo', '')
        if payInfo:
            OrderInfos.objects.create(**payInfo)
            del request.session['payTime']
            del request.session['payInfo']
    return redirect(reverse('shopper:shopper'))